/*
	Конфигурация системы
*/

#include "defines.h"

//Конфигурация нашего терминала
ConfigT mainConfig;

char output[256];
extern LOCALM localm[]; 

/*
	Считываем конфигурацию системы с SD карты
*/
void config_read(void)
{
	U8* start=0;
	U8* stop=0;
	U8 line=0;
	char *p;
	
	FILE * f;
	char cfg[1024];
	char *c = &cfg[0];
	
	U16 interval=15; 
	
	printf("Read device configuration\r\n");

	f = fopen(MODE_MON_FILE,"r");
	//Файл не найден
	if (f==NULL)
	{
		printf(MODE_MON_FILE); printf(" not found\r\n");
	}
	//Считываем параметры
	else 
	{
		memset(cfg,0x00,sizeof(cfg));
		while(!feof(f))
		{
			*c++ = fgetc (f);
		}
		fclose(f);
	}
	
	
	//А теперь парсим файл
	p = &cfg[0];
	memset(output,0x00,sizeof(output));
	
	while(*p)
	{
		if (*p==0x0A)
		{
			line++;
			if (line==1)
			{
				sscanf(p,"%d\r\n",&interval);
			}
			else if (line==3)
				sscanf(p,"%d\r\n",&mainConfig.states);
			else if (line==5)
				sscanf(p,"%d\r\n",&mainConfig.input_levels[0]);	
			else if (line==6)
				sscanf(p,"%d\r\n",&mainConfig.input_levels[1]);	
			else if (line==7)
				sscanf(p,"%d\r\n",&mainConfig.input_levels[2]);	
			else if (line==8)
				sscanf(p,"%d\r\n",&mainConfig.input_levels[3]);	
			else if (line==9)
				sscanf(p,"%d\r\n",&mainConfig.input_levels[4]);	
			else if (line==10)
				sscanf(p,"%d\r\n",&mainConfig.input_levels[5]);	
			else if (line==11)
				sscanf(p,"%d\r\n",&mainConfig.input_levels[6]);	
			else if (line==12)
				sscanf(p,"%d\r\n",&mainConfig.input_levels[7]);	
			else if (line==14)
				sscanf(p,"%d\r\n",&Out_time.time_out1);
			else if (line==15)
				sscanf(p,"%d\r\n",&Out_time.time_out2);
			else if (line==16)
				sscanf(p,"%d\r\n",&Out_time.time_out3);
			else if (line==18)
				start=p+1;
			else if (line==21)
			  stop = p;
		}
		p++;
	}
	
	//Строка - логическая формула выходов
	memcpy(output,start,stop-start+1);
	
	printf("%d %d %d %d %d\r\n%s\r\n",interval,mainConfig.states,Out_time.time_out1,Out_time.time_out2,Out_time.time_out3, output);
	mainConfig.mainInterval = ((U32)interval)*1000;

	
	//А теперь пребобразуем
	if (sd_ok)
	{
		printf("Forming output formula\r\n");
		out_arry(&output[0]);
	}
	
	//Считываем IP адрес
	config_read_ip();
	//Считываем адрес сервера
	config_read_server();
	printf("Server address: %d.%d.%d.%d:%d\r\n",serverIP[0],serverIP[1],serverIP[2],serverIP[3],serverPort);
	//Считываем MAC адрес
#warning Что делать если MAC не совпал???	
	config_read_mac();
}

/*
	Считываем IP адрес из файла
	Возвращает ноль, если ошибка
*/
void config_read_ip()
{
	FILE * f;
	LOCALM temp;
	char data[50];
	char *c=data;
	
	//Пробуем открыть файл
	if ((f = fopen(IP_FILE,"r"))==NULL)
		printf("%s not found\r\n",IP_FILE);
	else
	{
		//Считываем содержимое файла
		memset(data,0x00,sizeof(data));
		while(!feof(f)&&((c-data)<sizeof(data)))
		{
			*c++ = fgetc (f);
		}
		fclose(f);
		if (sscanf(data,"%d.%d.%d.%d %d.%d.%d.%d %d.%d.%d.%d",&temp.IpAdr[0],&temp.IpAdr[1],&temp.IpAdr[2],&temp.IpAdr[3],&temp.DefGW[0],&temp.DefGW[1],&temp.DefGW[2],&temp.DefGW[3],&temp.NetMask[0],&temp.NetMask[1],&temp.NetMask[2],&temp.NetMask[3])==12)
		{

			//Все удалось сосчитать!!!
			memcpy(&localm[NETIF_ETH],&temp,sizeof(temp));
			printf("Read params from file\r\n");
			printf("IP: %d.%d.%d.%d\r\nNetmask: %d.%d.%d.%d\r\nGateway: %d.%d.%d.%d\r\n", localm[NETIF_ETH].IpAdr[0],localm[NETIF_ETH].IpAdr[1],localm[NETIF_ETH].IpAdr[2],localm[NETIF_ETH].IpAdr[3],localm[NETIF_ETH].NetMask[0],localm[NETIF_ETH].NetMask[1],localm[NETIF_ETH].NetMask[2],localm[NETIF_ETH].NetMask[3],localm[NETIF_ETH].DefGW[0],localm[NETIF_ETH].DefGW[1],localm[NETIF_ETH].DefGW[2],localm[NETIF_ETH].DefGW[3]);
			netParamsOK=1;
			return; 
		}
	}
	//Если сюда пришли - значит ошибка
	needDHCP=1;
	dhcpTime = SystemTick;
	printf("Error reading net parameters.Need DHCP\r\n");
	
}
void config_read_server()
{
	FILE * f;
	char data[50];
	char *c=data;
	U8 temp_ip [] = SERVER_IP;
	
	//Пробуем открыть файл
	if ((f = fopen(SERVER_FILE,"r"))==NULL)
		printf("%s not found\r\n",SERVER_FILE);
	else
	{
		//Считываем содержимое файла
		memset(data,0x00,sizeof(data));
		while(!feof(f)&&((c-data)<sizeof(data)))
		{
			*c++ = fgetc (f);
		}
		fclose(f);
		if (sscanf(data,"%d.%d.%d.%d %d",&serverIP[0],&serverIP[1],&serverIP[2],&serverIP[3],&serverPort)==5)
		{
			//Все удалось сосчитать!!!
			printf("Reading server IP and port from file\r\n");
			return; 
		}
	}
	//Если сюда пришли - значит ошибка
	printf("Error reading server address.Need to use default\r\n");
	memcpy(&serverIP, temp_ip,4);
	serverPort = SERVER_TCP_PORT;
}
//Чтение MAC адреса и сравнение с текущим
U8 config_read_mac()
{
	FILE * f;
	char data[50];
	char *c=data;
	U8 temp[6];
	
	//Пробуем открыть файл
	if ((f = fopen(MAC_FILE,"r"))==NULL)
		printf("%s not found\r\n",MAC_FILE);
	else
	{
		//Считываем содержимое файла
		memset(data,0x00,sizeof(data));
		while(!feof(f)&&((c-data)<sizeof(data)))
		{
			*c++ = fgetc (f);
		}
		fclose(f);
		
		if (sscanf(data,"%x:%x:%x:%x:%x:%x",&temp[0],&temp[1],&temp[2],&temp[3],&temp[4],&temp[5])==6)
		{
			//Все удалось сосчитать!!!
			//Сравниваем
			if (memcmp(temp,mac,6)==0)
			{
				printf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
				return 1; 
			}
		}
	}
	//Если сюда пришли - значит ошибка
	printf("Error MAC\r\n");
	return 0;
}

